package com.xuecheng.content.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xuecheng.api.content.model.dto.TeachplanDTO;
import com.xuecheng.api.content.model.dto.TeachplanMediaDTO;
import com.xuecheng.content.entity.Teachplan;

/**
 * <p>
 * 课程计划 服务类
 * </p>
 *
 * @author itcast
 * @since 2021-12-12
 */
public interface TeachplanService extends IService<Teachplan> {


    /**
     * 根据课程id查询课程计划的树形结构，即三级目录
     *
     * @param courseId  课程id
     * @param companyId 公司id
     * @return com.xuecheng.api.content.model.dto.TeachplanDTO
     * @author Lily
     * @date 2021/12/12 20:02
     * @paramType [java.lang.Long, java.lang.Long]
     * @description
     */
    TeachplanDTO queryTreeNodesByCourseId(Long courseId, Long companyId);


    /**
     * 创建或修改教学计划
     *
     * @param teachplanDTO 前端传递的数据
     * @param companyId 公司id
     * @return com.xuecheng.api.content.model.dto.TeachplanDTO
     * @author Lily
     * @date 2021/12/12 21:51
     * @paramType [com.xuecheng.api.content.model.vo.TeachplanVO]
     * @description
     *
     * 业务分析：修改和添加的区别在于是否有id
     * 1.TeachplanDTO 中的 Id 不为空并且在数据库中存在此 Id 数据，进行修改操作。
     * 2.TeachplanDTO 中的 为空，进行添加操作。
     *
     * 主体方法：
     * 1.判断业务操作
     * 1-1.判断是修改还是新增：teachplanId，有则修改，无则创建
     *
     * 2.执行创建和修改，并返回dto
     *
     */
    TeachplanDTO createOrModifyTeachPlan(TeachplanDTO teachplanDTO, Long companyId);

    /**
     * 删除教学计划
     *
     * @param teachPlanId 教学计划id
     * @param companyId   公司id标识
     * @author Lily
     * @date 2021/12/13 10:38
     * @paramType [java.lang.Long, java.lang.Long]
     * @description
     */
    void removeTeachPlan(Long teachPlanId, Long companyId);

    
    /**
    * @author Lily
    * @date 2021/12/20 23:38
    * @paramType [com.xuecheng.api.content.model.vo.BindTeachplanMediaVO, java.lang.Long] 
    * @param dto
    * @param companyId 
    * @return com.xuecheng.api.content.model.dto.TeachplanMediaDTO
    * @description 课程计划服务类
     * 业务分析：
     * 1.判断关键数据
     *   teachplanId   mediaId
     * 2.判断业务数据
     *   课程计划数据
     *     判断是否存在
     *     判断是否是第三级
     *     判断课程类型是否为点播
     *     判断是否为同一家机构
     *       根据课程基础信息来查询
     *   媒资数据
     *     判断是否存在
     *     判断是否为同一家机构
     *     判断媒资信息是否审核通过
     * 3.保存课程计划和媒资信息关联关系
     *   判断关联数据是否存在
     *     不存在
     *       创建数据
     *     存在
     *       修改数据
     *         mediaId 和 mediaName
     * 4.将数据封装成dto返回
    */

    TeachplanMediaDTO associateMedia(TeachplanMediaDTO dto, Long companyId);
    
}
